function parseQueryString(url) {
  // 提取查询字符串部分（从 '?' 到末尾或 # 之前）
  const queryIndex = url.indexOf('?');
  const hashIndex = url.indexOf('#');

  let queryString = '';
  if (queryIndex !== -1) {
    // 如果有 #，则取 ? 到 # 之间的部分；否则取 ? 到末尾
    queryString = hashIndex !== -1 && hashIndex > queryIndex
      ? url.slice(queryIndex + 1, hashIndex)
      : url.slice(queryIndex + 1);
  }

  // 处理空查询字符串
  if (!queryString) return {};

  // 解析键值对
  const params = {};
  const pairs = queryString.split('&');

  for (const pair of pairs) {
    const [key, value] = pair.split('=').map(decodeURIComponent);

    if (key) {
      // 处理重复键（转为数组）
      if (params[key] !== undefined) {
        if (!Array.isArray(params[key])) {
          params[key] = [params[key]];
        }
        params[key].push(value);
      } else {
        params.key = value;
      }
    }
  }

  return params;
}

// 示例用法
const url = 'https://example.com/path?name=John&age=30&hobbies=reading&hobbies=coding#section';
const parsed = parseQueryString(url);

console.log(parsed);
// 输出:
// {
//   name: 'John',
//   age: '30',
//   hobbies: ['reading', 'coding']
// }    